import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as cookieParser from 'cookie-parser';
import * as session from 'express-session';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import { engine } from 'express-handlebars';
// import { ValidationPipe } from '@nestjs/common';
import { I18nValidationPipe, I18nValidationExceptionFilter } from 'nestjs-i18n';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
// import { ExtendedConsoleLogger } from './extended-console-logger';
// import { MyLogger } from './my-logger';
import { useContainer } from 'class-validator';
import * as helpers from 'src/shared/helpers';

(async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule, {
    // logger: false, // 关闭日志输出
    // logger: ['error', 'warn'], // 启用特别的日志级别
    // logger: console, // 自定义实现，启用控制台日志输出
    // logger: new ExtendedConsoleLogger(), //扩展内置的日志
    // bufferLogs: true, // 启用缓冲日志输出
  });
  //app.useLogger(app.get(MyLogger)); // app.get 可以拿到MyLogger单例实例（取决于该实例首先注入另一个模块）
  // 注入容器，解决class-validator依赖注入问题（可以注入数据库了）
  useContainer(app.select(AppModule), { fallbackOnErrors: true });
  // 配置静态文件根目录
  app.useStaticAssets(join(__dirname, '../', 'public'));
  // 配置模板文件根目录
  app.setBaseViewsDir(join(__dirname, '../', 'views'));
  // 配置handlebars模板引擎
  app.engine(
    'hbs',
    engine({
      helpers, // 注册自定义helpers,模板中可以使用函数
      extname: '.hbs',
      runtimeOptions: {
        allowProtoMethodsByDefault: true, // 允许访问原型的方法
        allowProtoPropertiesByDefault: true, // 允许访问原型的属性
      },
    }),
  );
  // 配置渲染模板的引擎为hbs
  app.set('view engine', 'hbs');
  app.use(cookieParser());
  app.use(
    session({
      secret: 'secret-key',
      resave: true,
      saveUninitialized: true,
      cookie: { maxAge: 60 * 60 * 1000 * 24 * 7 },
    }),
  );
  // 全局管道验证, 可以进行数据转换
  // app.useGlobalPipes(new ValidationPipe({ transform: true }));
  app.useGlobalPipes(new I18nValidationPipe({ transform: true }));
  app.useGlobalFilters(
    new I18nValidationExceptionFilter({ detailedErrors: true }),
  );
  // 创建一个新的documentBuild实例，配置swagger
  const config = new DocumentBuilder()
    .setTitle('CMS API')
    .setDescription('The CMS API description')
    .setVersion('1.0')
    .addTag('CMS')
    .addCookieAuth('connect.sid') // 添加cookie认证 cookie的名称connect.sid
    .addBearerAuth({
      // 添加Bearer认证方式 在请求头里添加 Authorization:Bearer token
      type: 'http',
      scheme: 'bearer',
      bearerFormat: 'JWT',
    })
    .build();
  // 使用配置对象创建swagger文档
  const document = SwaggerModule.createDocument(app, config);
  // 将swagger文档挂载到/api-doc路径下: http://localhost:3000/api-doc 访问文档
  SwaggerModule.setup('api-doc', app, document);

  await app.listen(process.env.PORT ?? 3000);
})();
